• 问题

    字符串在实际开发中被高频使用,同样也存在着被滥用的情况,那么,字符串不应该使用在哪些情形下呢?

  • 解决

    1. 字符串不适合代替其他值的类型:当原始类型为int、float等其他类型时,就不要使用字符串替代;

    2. 字符串不适合代替枚举类型:枚举类型比字符串更适合用来表示枚举的常量;

    3. 字符串不适合代替聚集类型:如果一个实体有多个组件,用字符串来表示这个实体通常不恰当,String compundKey = className + "#" + i.next(),更好的做法是编写一个类来描述这个数据集,通常是一个私有的静态成员类;

    4. 字符串不适合作为授权键:有时候,字符串被用于对某种功能进行授权访问,考虑设计一个提供线程局部变量的机制,这个机制提供的变量在每个线程中都有自己的值,示例代码:

      public class ThreadLocal {
          private ThreadLocal() {}
          public static void set(String key, Object value);
          public static Object get(String key);
      }
      

      这种方法的问题在于,字符串键代表一个共享的全局命名空间,要使这种办法可行,客户端提供的字符串必须是唯一的,如果使用了相同的字符串,实际上就共享了这个变量。可以采用以下这种方式进行修正:

      public class ThreadLocal {
          private ThreadLocal() {}
          public static class Key {
              Key() {}
          }
          public static Key getKey() {
              return new Key();
          }
          public static void set(Key key, Object value);
          public static Object get(Key key);
      }
      

      这种采用对象实例作为授权键的话,就能够保证全局唯一。事实上,ThreadLocal也是采用这种方式,将ThreadLocal实例作为了ThreadLocalMap的键。

  • 结论

    总之,如果可以使用更加合适的数据类型,或者可以编写更加适当的数据类型,就应该避免使用字符串来表示对象。如果使用不当,字符串会比其他类型更加笨拙、速度更慢。字符串经常被错误的用来替代基本类型、枚举类型。

results matching ""

    No results matching ""